# [钛妹]: 基础不牢谈何AI？今天钛妹又学习了Python的*args和**kwargs的高级用法，欢迎大神们指正错误！

# [钛妹]: 钛哥钛哥，上次你教了我 *args 和 **kwargs 的定义，感觉自己功力大增！今天我想更进一步，看看它们还能怎么用？
def test_args_kwargs(arg1, arg2, arg3):
    # [钛哥]:  呦，钛妹进步很快嘛！*args 和 **kwargs  除了定义函数，在**调用函数**的时候也能大显身手！你看这个简单的函数 `test_args_kwargs`，它接收三个参数。
    print("arg1:", arg1)
    # [钛妹]:  嗯嗯，这个函数我知道，就是打印三个参数的值嘛，这跟 *args 和 **kwargs 有啥关系呢？
    print("arg2:", arg2)
    print("arg3:", arg3)

args = ("hello", 123, "world")
# [钛哥]:  重点来啦！假设我们有一个元组 `args`，里面放了三个值，我们想把这三个值**按顺序**传给 `test_args_kwargs`  的 `arg1`, `arg2`, `arg3`， 就可以用 *args  来解包！
test_args_kwargs(*args)
# [钛妹]:  解包？你是说把元组里的值一个一个拿出来，对应到函数的参数上？ 就像拆礼物一样？
# 运行结果：
# arg1: hello
# arg2: 123
# arg3: world

# 使用 **kwargs 调用函数
kwargs = {"arg3": "你好", "arg2": 456, "arg1": "python"}
# [钛哥]:  Bingo！完全正确！*args  就像一个拆包神器，把元组或列表里的元素按位置解包。
# [钛哥]: 同样的，**kwargs  可以解包字典！ 比如我们有个字典 `kwargs`，Key  和 `test_args_kwargs`  的参数名对应，就可以用 **kwargs  来传递**关键字参数**！
test_args_kwargs(**kwargs)
# [钛妹]:  哇，**kwargs  更智能！它是根据字典的 Key  来匹配参数名字的，不用管顺序！ 运行一下看看？
# 运行结果：
# arg1: python
# arg2: 456
# arg3: 你好

# [钛哥]:  看到了吧？ *args  和 **kwargs  在函数调用时，可以帮助我们**动态地**传递参数，让代码更简洁灵活。 
# [钛哥]: 记住，定义函数时，参数顺序是 `fargs, *args, **kwargs`， 调用函数时，也要注意 *args  和 **kwargs  的用法哦！

# [钛妹]: 好啦，这期内容到此结束，你是不是感觉又进步了一点点？点赞关注不迷路！
print("好啦，这期内容到此结束，你是不是感觉又进步了一点点？点赞关注不迷路！")